///******************************************************************************* // * Copyright (c) 2004, 2007 IBM Corporation and others. // * All rights reserved. This program and the accompanying materials // * are made available under the terms of the Eclipse Public License v1.0 // * which accompanies this distribution, and is available at // * http://www.eclipse.org/legal/epl-v10.html // * // * Contributors: // * IBM Corporation - initial API and implementation // *******************************************************************************/ //package org.eclipse.ui.tests.dnd; // //import org.eclipse.core.resources.IFile; //import org.eclipse.core.resources.IProject; //import org.eclipse.jface.preference.IPreferenceStore; //import org.eclipse.swt.SWT; //import org.eclipse.swt.widgets.Display; //import org.eclipse.swt.widgets.Shell; //import org.eclipse.ui.IEditorPart; //import org.eclipse.ui.IWorkbenchPreferenceConstants; //import org.eclipse.ui.internal.WorkbenchPage; //import org.eclipse.ui.internal.WorkbenchWindow; //import org.eclipse.ui.internal.dnd.TestDropLocation; //import org.eclipse.ui.internal.util.PrefUtil; //import org.eclipse.ui.part.FileEditorInput; //import org.eclipse.ui.tests.api.MockEditorPart; //import org.eclipse.ui.tests.autotests.AbstractTestLogger; //import org.eclipse.ui.tests.autotests.UITestCaseWithResult; //import org.eclipse.ui.tests.harness.util.FileUtil; // ///** // * Tests a single drag-drop scenario, given a dragSource capable of initiating the drag and // * a dropTarget that can locate the drop location. DragTestSuite will create a large number // * of DragTests by matching combintations of drag sources with drop targets. // *<p></p> // * <p> // * <b>TEST NAMES:</b> // * </p> // * <p> // * The name of the test indicates what drag scenario was being attempted. For example, the // * test "drag Navigator to right of editor area" drags the Navigator view over // * the editor area, dropping it near the right edge. Drag sources are described as follows: // * </p> // * <p></p> // * <p> // * [maximized] viewname [folder] // * </p> // * <p></p> // * <p>Drag sources prefixed by "maximized" were maximized at the time the drag started. // * The word [folder] indicates that folder containing the given editor or view was being dragged. // * Otherwise, the view itself was being dragged.</p> // * <p></p> // * <p>Drop targets are described as follows:</p> // * <p></p> // * <p> // * [left|right|top|bottom|center] of targetname // * </p> // * <p></p> // * <p>Drop targets are always on top of the target. That is, "right of Navigator" means "on top of // * the navigator view near its right edge" -- NOT "to the right of the Navigator view". When the // * drop target is on an edge, it is always located 1 pixel away from the middle of that edge.</p> // * // *<p></p> // * <p> // * <b>WHAT TO DO IF THIS TEST FAILS:</b> // * </p> // * <p> // * If a drag operation did not have the intended effect, the test will fail with // * a result like: // * </p> // * <p></p> // * <p> // * Expecting 'layout ((((*Navigator)-active (*Problems))|layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2)))-(*Outline, Properties))' and found 'layout ((layout ((Mock Editor 1, *Mock Editor 2)|active_nofocus (*Mock Editor 2))-(*Outline, Problems, Properties))-active (*Navigator))' // * </p> // * <p></p> // * <p> // * The expected and actual results are ASCII pictures of the layout. A stack of views or editors // * is shown as a list enclosed in brackets, with an asterisk indicating the selected pane. The stack // * may be prefixed by the words "active" or "active_nofocus" if they currently have the active or // * active_nofocus appearance. Inactive stacks have no prefix. // * </p> // * <p></p> // * <p> // * For example, (Problems, *Console, Properties) indicates a stack containing the Problems, Console, and Properties views, // * where the Console view was currently selected. The root layout and editor areas are shown as "layout (...)". A vertical sash is shown as a // * bar "|" and a horizontal sash is shown using a dash "-". All drag tests are done in the Drag Test // * Perspective. // * </p> // * <p> // * The initial layout is: // * </p> // * <p></p> // * <p> // * layout (((*Navigator)|layout ((Mock Editor 1, *Mock Editor 2)|active (*Mock Editor 2)))-(*Outline, Problems, Properties)) // * </p> // * <p></p> // * <p> // * Where editor 0 is "Mock Editor 1", and editors 1 and 2 are shown as "Mock Editor 2". // * </p> // * <p></p> // * <p> // * If you see a message like "dragtests.xml is out of date", this indicates that new tests // * were added without describing their intended behavior in dragtests.xml. In that case, ensure that // * there are currently no failures and regenerate dragtests.xml as described below. // * </p> // * <p></p> // * <p> // * <b>WHAT TO DO IF THE INTENTED BEHAVIOR CHANGES:</b> // * </p> // * <p> // * If new tests are added or the existing drag/drop behavior is changed, it will // * be necessary to update dragtests.xml. Do this as follows:</p> // * <ul> // * <li>include org.eclipse.ui.tests with your other plugins and launch an inner workspace</li> // * <li>Go to customize perspective... -> commands -> Drag Test. This will add the "Drag-Drop Snapshot" item to your menubar.</li> // * <li>Select "Drag-Drop Snapshot"</li> // * <li>Select a file where the new shapshot will be saved, and click Okay</li> // * <li>DO NOT use the mouse while generating dragtests.xml. This // * can interfere with the tests and cause an incorrect behavior to be recorded as the expected behavior. // * In particular, focus changes should be avoided.</li> // * <li>Wait for several minutes while the test runs</li> // * <li>When the test is complete, copy the file over the old data/dragtests.xml file</li> // * </ul> // * <p> // * At this point, the current drag/drop behavior will be considered the correct behavior, // * and deviations will cause the test suites to fail. // * </p> // * // * @since 3.0 // */ //public class DragTest extends UITestCaseWithResult { // TestDragSource dragSource; // // TestDropLocation dropTarget; // // String intendedResult; // // // // static IProject project; // // static IFile file1, file2; // // IEditorPart editor1, editor2; // // static IFile file3; // // IEditorPart editor3; // // static WorkbenchWindow window; // // static WorkbenchPage page; // // public DragTest(TestDragSource dragSource, TestDropLocation dropTarget, AbstractTestLogger log, String suffix) { // super("drag " + dragSource.toString() + " to " + dropTarget.toString() + suffix, log); // this.dragSource = dragSource; // this.dropTarget = dropTarget; // } // // public DragTest(TestDragSource dragSource, TestDropLocation dropTarget, AbstractTestLogger log) { // this(dragSource, dropTarget, log, ""); // } // // public void doSetUp() throws Exception { // // don't allow UITestCase to manage the deactivation of our window // manageWindows(false); // //window = (WorkbenchWindow)openTestWindow(); // // //initialize the window // if (window == null) { // window = (WorkbenchWindow) fWorkbench.openWorkbenchWindow( // "org.eclipse.ui.tests.dnd.dragdrop", getPageInput()); // // page = (WorkbenchPage) window.getActivePage(); // // project = FileUtil.createProject("DragTest"); //$NON-NLS-1$ // file1 = FileUtil.createFile("DragTest1.txt", project); //$NON-NLS-1$ // file2 = FileUtil.createFile("DragTest2.txt", project); //$NON-NLS-1$ // file3 = FileUtil.createFile("DragTest3.txt", project); //$NON-NLS-1$ // // // Disable animations since they occur concurrently and can interferre // // with locating drop targets // IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); // apiStore.setValue( // IWorkbenchPreferenceConstants.ENABLE_ANIMATIONS, // false); // } // // page.resetPerspective(); // page.closeAllEditors(false); // // //ensure that contentoutline is the focus part (and at the top of its stack) // page.showView("org.eclipse.ui.views.ContentOutline"); // page.hideView(page.findView("org.eclipse.ui.internal.introview")); // editor1 = page.openEditor(new FileEditorInput(file1), // MockEditorPart.ID1); // editor2 = page.openEditor(new FileEditorInput(file2), // MockEditorPart.ID2); // editor3 = page.openEditor(new FileEditorInput(file3), // MockEditorPart.ID2); // // window.getShell().setActive(); // DragOperations // .drag(editor2, new EditorDropTarget(new ExistingWindowProvider(window), 0, SWT.CENTER), false); // DragOperations // .drag(editor3, new EditorAreaDropTarget(new ExistingWindowProvider(window), SWT.RIGHT), false); // } // // /** // * This method is useful in order to 'freeze' the test environment after a particular test in order to // * manipulate the environment to figure out what's going on. It essentially opens a new shell and enters // * a modal loop on it, preventing the tests from continuing until the 'stall' shell is closed. Note that // * using a dialog would prevent us from manipulating the shell that the drag and drop tests are being performed in // */ // public void stallTest() { // // Add the explicit test names that you want to stall on here... // // (It's probably easiest to cut them directly from the exected results file) // String[] testNames = { // }; // // // Does the name match any of the explicit test names?? // boolean testNameMatches = false; // for (int i = 0; i < testNames.length; i++) { // if (testNames[i].equals(this.getName())) { // testNameMatches = true; // break; // } // } // // // Stall always if no explicit names are supplied. Otherwise only stall when there's a // // match. // if (testNames.length == 0 || testNameMatches) { // Display display = Display.getCurrent(); // Shell loopShell = new Shell(display, SWT.SHELL_TRIM); // loopShell.setBounds(0,0,200,100); // loopShell.setText("Test Stall Shell"); // loopShell.setVisible(true); // // while (loopShell != null && !loopShell.isDisposed()) { // if (!display.readAndDispatch()) // display.sleep(); // } // } // } // // public String performTest() throws Throwable { // // Uncomment the following line to 'stall' the tests here... // //stallTest(); // // // KLUDGE!! revert to the old min/max when dragging maximized views // // see bug 180242. This code should disappear before release... // IPreferenceStore apiStore = PrefUtil.getAPIPreferenceStore(); // boolean curMinMaxState = apiStore.getBoolean(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX); // if (getName().indexOf("drag maximized") >= 0) // apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, false); // // dragSource.setPage(page); // // dragSource.drag(dropTarget); // // page.testInvariants(); // // // Uncomment the following line to 'stall' the tests here... // //stallTest(); // // // KLUDGE!! Restore the min/max pref // apiStore.setValue(IWorkbenchPreferenceConstants.ENABLE_NEW_MIN_MAX, curMinMaxState); // // return DragOperations.getLayoutDescription(page); // } //}